package DAO;
import MAIN.GeneratePublicPrivateKeys;
import MAIN.usc_Certificate;
import static MAIN.usc_sessionkey_mac.Decrypt;
import static MAIN.usc_sessionkey_mac.Encrypt;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Anonymous
 */
public class Connect {
    public static java.sql.Connection con;
    //Các giá trị prefs
    protected static final String PREF_TENSV = "TENSV";
    protected static final String PREF_PORT = "PORT";
    protected static String TenSV ; //địa chỉ server
    protected static int portS ;//port server
    protected static Socket echoSocket;
    
    //Hàm kết nối thử đến server đầu vào là tên server và port (dùng khi kiểm tra kết nối thử và lưu cấu hình)
    public static boolean ConnectT(String tTenSV,int tPort)
    {
        try
        {
            echoSocket = new Socket(tTenSV, tPort);
            echoSocket.close();
            return true;
        } catch (UnknownHostException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return false;
    }
    
    //Hàm kết nối thử đến server dùng thông tin server đã được lưu
    public static boolean tConnect()
    {
        Preferences prefs = Preferences.userNodeForPackage(Connect.class);
       // prefs.put(PREF_TENSV, "");
        //prefs.put(PREF_PORT, "");
        TenSV = prefs.get(PREF_TENSV, "localhost"); 
        portS = prefs.getInt(PREF_PORT, 1234);
        try
        {
            echoSocket = new Socket(TenSV, portS);
            echoSocket.close();
            return true;
        } catch (UnknownHostException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return false;
    }
    
    //Hàm mở kết nối đến server để trao đổi thông tin
    public static boolean Connect()//khi su dung can dung ham closeconnect de dong ket noi sau khi giao tiep xong
    {
        Preferences prefs = Preferences.userNodeForPackage(Connect.class);
       // prefs.put(PREF_TENSV, "");
        //prefs.put(PREF_PORT, "");
        TenSV = prefs.get(PREF_TENSV, "localhost"); 
        portS = prefs.getInt(PREF_PORT, 1234);
        try
        {
            echoSocket = new Socket(TenSV, portS);
            return true;
        } catch (UnknownHostException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return false;
    }
    
    //Hàm đóng kết nối
    public static boolean CloseConnect()
    {
        try {
            echoSocket.close();
            return true;
        } catch (IOException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return false;
    }
    
    //Hàm chuyển dữ liệu đến server đầu vào là pkdto
    public static boolean sendData(DTO.PacketDTO pkdto)
    {
        try {
            //
            String secret_key = MAIN.GeneratePublicPrivateKeys.secret_key;
            String secret_key2 = "default";
            boolean use_secret_key = MAIN.GeneratePublicPrivateKeys.use_secret_key;
            if(use_secret_key==true)
            {
                secret_key2 = secret_key;
                //System.out.println("Su dung secret_key khac default.");
            }
            byte[] encrypt = Encrypt(secret_key2, pkdto);
            OutputStream os = echoSocket.getOutputStream();  
            ObjectOutputStream oos = new ObjectOutputStream(os);  
            oos.writeObject(encrypt);  
            //
            /*
            OutputStream os = echoSocket.getOutputStream();  
            ObjectOutputStream oos = new ObjectOutputStream(os);  

            oos.writeObject(pkdto);  
            */
            return true;
        } catch (IOException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return false;
    }
    
    //Hàm nhận dữ liệu từ server đầu ra là pkdto tùy vào đối tượng server gửi đến mặc định là DTO.PacketDTO
    public static Object receiveData()
    {
        try {
            String secret_key = MAIN.GeneratePublicPrivateKeys.secret_key;
            InputStream is = echoSocket.getInputStream();  
            ObjectInputStream ois = new ObjectInputStream(is);  
            Object obj = ois.readObject();              
            byte[] encrypt = (byte[])obj;
            Object pkdto = Decrypt(secret_key, encrypt);
            /*
            InputStream is = echoSocket.getInputStream();  
            ObjectInputStream ois = new ObjectInputStream(is);  
            Object pkdto=ois.readObject();  
            */
            return pkdto;
        } catch (IOException | ClassNotFoundException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }
    
        return null;
    }
}
